// @ts-ignore
import { toast } from '@/uni_modules/uview-plus';
import {StorageUtil } from '@/utils/storage';
const requestInterceptors = (http: any): void => {
  /**
   * 请求拦截
   * @param {Object} http
   */
  http.interceptors.request.use(
    (config: any) => {
      // 可使用 async await 做异步操作
      // 初始化请求拦截器时，会执行此方法，此时 data 为 undefined，赋予默认 {}
      config.data = config.data || {};
      if (config?.custom?.auth) {
         config.header.Authorization = 'Bearer ' + StorageUtil.getLocalStorage('ACCESS_TOKEN');
      }
      if (config?.custom?.loading) {
        // 设置一个 1 秒的定时器
        const showLoadingTimeoutId = setTimeout(() => {
            uni.showLoading({
                title: '加载中...',
                mask: true
            });
        }, 1000);
        // 设置定时器，5 秒后取消加载提示并弹出 toast 提示
        const timeoutId = setTimeout(() => {
            // 清除显示加载提示的定时器
            clearTimeout(showLoadingTimeoutId);
            uni.hideLoading();
            uni.showToast({
                title: '连接超时',
                icon: 'error',
                duration: 2000
            });
        }, 5000);
        // 将定时器 ID 存储在 config 中，以便在响应拦截器中清除
        config._loadingTimeoutId = timeoutId;
        config._showLoadingTimeoutId = showLoadingTimeoutId;
      }
      return config;
    },
    (config: any) => {
      // 可使用 async await 做异步操作
      return Promise.reject(config);
    }
  );
};

const responseInterceptors = (http: any): void => {
  /**
   * 响应拦截
   * @param {Object} http 
   */
  http.interceptors.response.use(
    (response: any) => {
        // 清除显示加载提示的定时器
        const showLoadingTimeoutId = response.config?._showLoadingTimeoutId;
        if (showLoadingTimeoutId) {
            clearTimeout(showLoadingTimeoutId);
        }
        // 清除定时器
        const timeoutId = response.config?._loadingTimeoutId;
        if (timeoutId) {
            clearTimeout(timeoutId);
        }
        // 隐藏加载提示
        uni.hideLoading();
        // 对响应成功做点什么 可使用 async await 做异步操作
        const data = response.data;
        const custom = response.config?.custom;
        if (data.code !== 200) {
            // 服务端返回的状态码不等于 200，则 reject()
            // 如果没有显式定义 custom 的 toast 参数为 false 的话，默认对报错进行 toast 弹出提示
            if (custom?.toast !== false) {
                toast(data.msg);
            }

            switch (data.code) {
                case 401: {
                    uni.reLaunch({ url: '/' });
                    return;
                }
            }

            if (custom?.catch) {
                return Promise.reject(data);
            } else {
                // 否则返回一个 pending 中的 promise
                return new Promise(() => {});
            }
        }
        return data === undefined ? {} : data;
    },
    (response: any) => {
        // 清除显示加载提示的定时器
        const showLoadingTimeoutId = response.config?._showLoadingTimeoutId;
        if (showLoadingTimeoutId) {
            clearTimeout(showLoadingTimeoutId);
        }
        // 清除定时器
        const timeoutId = response.config?._loadingTimeoutId;
        if (timeoutId) {
            clearTimeout(timeoutId);
        }
        // 隐藏加载提示
        uni.hideLoading();
        // 对响应错误做点什么 （statusCode !== 200）
        return Promise.reject(response);
    }
  );
};

export { requestInterceptors, responseInterceptors };